#include <Arduino.h>
#include "wms_wifi.h"
#include "wms_button.h"
#include "wms_printer.h"
#include "wms_http.h"
#include "wms_device.h"
#include "wms_timer.h"
#include "wms_hal.h"
#include "wms_adc.h"

extern bool callwebportal;
extern bool iskeypressed;

// 声明图像打印测试函数
// extern void print_test_image();
// extern void print_small_test_image();
extern void print_small_test_pattern();

void setup()
{
  Serial.begin(115200);
  Serial.println("\n\n开始初始化...");

  // 初始化设备状态（应该最先初始化）
  init_device_state();
  
  button_init();
  init_printer();

  // 初始化WiFi管理器
  if (!WifiManager.init())
  {
    Serial.println("WiFi管理器初始化失败");
    return;
  }
  
  // 连接到WiFi
  if (!WifiManager.connect())
  {
    Serial.println("WiFi连接失败！");
    return;
  }
  Serial.println("设置完成，ESP32已连接到WiFi");
  Serial.print("IP地址: ");
  Serial.println(WifiManager.getIPAddress());
  
  // 初始化其他模块
  init_http_server();
  init_timer();
  init_hal();
  adc_init();
  
  delay(100);
  // 尝试绑定到服务器
  const char* serverUrl = WifiManager.getServerUrl();
  if (serverUrl && strlen(serverUrl) > 0 && strcmp(serverUrl, DEFAULT_SERVER_URL) != 0) {
    Serial.print("尝试使用保存的URL绑定到服务器: ");
    Serial.println(serverUrl);
    
    if (WifiManager.bindToServer()) {
      Serial.println("服务器绑定成功");
      
      // 打印当前设备状态
      device_state_t *pdevice = get_device_state();
      Serial.println("设备状态检查:");
      Serial.print("WiFi状态: ");
      Serial.println(pdevice->wifi_state == WIFI_STATUS_CONNECTED ? "已连接" : "未连接");
      Serial.print("绑定状态: ");
      Serial.println(pdevice->device_bind_state == DEVICE_BINDED ? "已绑定" : "未绑定");
      Serial.print("服务器URL: ");
      Serial.println(pdevice->server_url);
      Serial.print("设备ID: ");
      Serial.println(pdevice->device_id);
    } else {
      Serial.println("服务器绑定失败，请手动绑定");
    }
  } else {
    Serial.println("服务器URL未设置或为默认值，请在WiFi配置页面设置服务器URL");
  }
}

void loop()
{
  // 处理WiFi事件
  WifiManager.handleEvents();

  // 处理WiFi重置
  if (callwebportal)
  {
    Serial.println("wifi重置按钮被按下，重置wifi设置...");
    WifiManager.resetSettings();
    callwebportal = false;
  }
  
  // 处理按钮事件
  btn_tick();
  
  // 处理打印请求
  if (iskeypressed)
  {
    Serial.println("按键被按下，开始打印测试图像");
    iskeypressed = false;
    
    // 使用图案函数
    testSTB();
  }
  
  // 处理HTTP请求
  handle_http_requests();

  // 心跳包任务运行
  heartbeat_task_run();
}
